package com.atomcorp.controlador;

import com.atomcorp.modelo.Catalogo;
import com.atomcorp.servicio.CatalogoServicio;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.control.cell.PropertyValueFactory;
import javax.swing.JOptionPane;
import vista.SistemaFacturacion;

/**
 *
 * @author Harold
 */
public class AdministrarCatalogosController implements Initializable {
    
    @FXML Button btnBuscar;
    @FXML Button btnNuevo;
    @FXML Button btnEliminar;
    @FXML Button btnCancelar;
    @FXML TextField txtNemonico;
    @FXML TextField txtNombre;
    @FXML TextField txtDescripcion;
    @FXML TableView tbCatalogos;
    @FXML Pagination pagination;
    @FXML TableColumn colNemonico;
    @FXML TableColumn colNombre;
    @FXML TableColumn colDescripcion;
    private Catalogo nuevoCatalogo;
    private CatalogoServicio catalogoServicio;
    private ObservableList<Catalogo> listaCatalogos = FXCollections.observableArrayList();
    private ObservableList<Catalogo> resulConsulta = FXCollections.observableArrayList();
    int pageCount = 5;
    int itemsPerPage = 5;
    int currentPageIndex = 0;
    private Long txtIdCatalogo;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        btnBuscar.setTooltip(new Tooltip("Buscar catálogo"));
        btnNuevo.setTooltip(new Tooltip("Guardar/Editar catálogo"));
        btnEliminar.setTooltip(new Tooltip("Eliminar catálogo"));
        btnCancelar.setTooltip(new Tooltip("Cancelar/limpiar"));
        btnEliminar.setDisable(true);
        catalogoServicio = new CatalogoServicio();
        iniciarColumnasTablaCatalogos();
        listarCatalogos();
        seleccionarCatalogo();
        paginarTabla();
    }
    
    public void ingresarCatalogos(){
        resulConsulta = catalogoServicio.obtenerCatalogoPorCriterio("NEMONICO",txtNemonico.getText());
        if(resulConsulta.size() == 0){
            nuevoCatalogo = new Catalogo(txtNemonico.getText(),txtNombre.getText(),txtDescripcion.getText(),Boolean.TRUE);
            catalogoServicio.ingresar(nuevoCatalogo);
        }else{
            nuevoCatalogo = new Catalogo(txtIdCatalogo, txtNemonico.getText(), txtNombre.getText(), txtDescripcion.getText(), Boolean.TRUE);
            catalogoServicio.editar(nuevoCatalogo);
        }
        listarCatalogos();
        limpiarCatalogo();
    }
    
    public void eliminarCatalogo(){
        int confirmarEliminar = JOptionPane.showConfirmDialog(null, "Realmente desea eliminar este catálogo?");
        if (confirmarEliminar == 0) {
            boolean ok = catalogoServicio.eliminar(txtIdCatalogo);
            if(ok){
               JOptionPane.showMessageDialog(null, "Registro eliminado correctamente"); 
               listarCatalogos();
            }
        }
    }
    
    public void buscarCatalogos(){
        if(!txtNemonico.getText().equals("")){
            listarCatalogosPorCriterio("NEMONICO",txtNemonico.getText());
        }else if(!txtNombre.getText().equals("")){
            listarCatalogosPorCriterio("NOMBRE",txtNombre.getText());
        }else{
            listarCatalogos();
        }
    }
    
    public void listarCatalogosPorCriterio(String condicion, String valor) {
        mostrarDetalleCatalogo(null);
        tbCatalogos.getItems().removeAll(listaCatalogos);
        if(listaCatalogos != null){listaCatalogos.removeAll(listaCatalogos);}
        listaCatalogos = catalogoServicio.obtenerCatalogoPorCriterio(condicion, valor.toUpperCase());
        if (listaCatalogos != null) {            
            actualizarTablaCatalogos();
        }
    }
    
    public void paginarTabla(){
        pageCount = getPageCount(listaCatalogos.size(), itemsPerPage);
        pagination.setPageCount(pageCount);
        pagination.currentPageIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
              currentPageIndex = newValue.intValue();
              actualizarTablaCatalogos();
            }
        });
    }
    
    public void iniciarColumnasTablaCatalogos(){
        colNemonico.setCellValueFactory(new PropertyValueFactory<Catalogo, String>("nemonico"));
        colNombre.setCellValueFactory(new PropertyValueFactory<Catalogo, String>("nombre"));
        colDescripcion.setCellValueFactory(new PropertyValueFactory<Catalogo, String>("descripcion"));
    }
    
    public void listarCatalogos() {
        mostrarDetalleCatalogo(null);
        tbCatalogos.getItems().removeAll(listaCatalogos);
        if(listaCatalogos != null){listaCatalogos.removeAll(listaCatalogos);}
        listaCatalogos = catalogoServicio.listarCatalogos();
        if (listaCatalogos != null) {          
            actualizarTablaCatalogos();
        }
    }
    
    private void mostrarDetalleCatalogo(Catalogo catalogo) {
        if (catalogo != null) {
            btnEliminar.setDisable(false);
            txtNemonico.setText(catalogo.getNemonico());
            txtNombre.setText(catalogo.getNombre());
            txtDescripcion.setText(catalogo.getDescripcion());
        } else {
            limpiarCatalogo();
        }
    }
    
    public void limpiarCatalogo() {
        nuevoCatalogo = new Catalogo();
        txtNemonico.setText("");
        txtNombre.setText("");
        txtDescripcion.setText("");
        btnEliminar.setDisable(true);
    }
    
    public void actualizarTablaCatalogos(){
        pageCount = getPageCount(listaCatalogos.size(), itemsPerPage);
        pagination.setPageCount(pageCount);
        tbCatalogos.getItems().setAll(listaCatalogos.subList(currentPageIndex * itemsPerPage, ((currentPageIndex * itemsPerPage + itemsPerPage <= listaCatalogos.size()) ? currentPageIndex * itemsPerPage + itemsPerPage : listaCatalogos.size())));
    }
    
    private int getPageCount(int totalCount, int itemsPerPage) {
        float floatCount = Float.valueOf(totalCount) / Float.valueOf(itemsPerPage);
        int intCount = totalCount / itemsPerPage;
        return ((floatCount > intCount) ? ++intCount : intCount);
    }
    
    public void seleccionarCatalogo(){
        tbCatalogos.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Catalogo>() {
            @Override
            public void changed(ObservableValue<? extends Catalogo> ov, Catalogo valorAnterior, Catalogo valorNuevo) { 
                if(valorNuevo != null){
                    txtIdCatalogo = valorNuevo.getId();
                    mostrarDetalleCatalogo(valorNuevo);
                }                
            }
        });
    }
    
    @FXML
    protected void itemAdministrar(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaAdministracion();
    }
    
    @FXML
    protected void itemCliente(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaClientes();
    }
    
    @FXML
    protected void itemProducto(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaAdministracion();
    }
    
    @FXML
    protected void itemFactura(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaFactura();
    }
    
    @FXML
    protected void itemReporte(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaAdministracion();
    }
    
}
